"""
把函数作为参数传入，或者返回值是另外一个函数，这样的函数成为高阶函数
高阶函数是函数式编程的体现。
函数式编程就是指这种高度抽象的编程范式。
函数式编程大量使用函数，减少了代码的重复，因此程序比较短，开发速度较快。
"""


# 一、函数的参数是函数
# 需求：对任意两个数字，整理之后(求绝对值、求平方...)再求和
def sum_num(a, b):
    return abs(a) + abs(b)


# 使用高阶函数的实现
def sun_num2(a, b, f):
    """
    使用函数f整理参数a,b后，在进行计算
    :param a:
    :param b:
    :param f: 就是对两个数字进行整理的函数
    :return:
    """
    return f(a) + f(b)


# 通过 绝对值函数 整理之后再求和
print(sun_num2(2, -6, abs))

# 通过 平方匿名函数 整理之后再求和
print(sun_num2(2, -6, lambda n: n ** 2))

# 二、函数的返回值是函数
"""
高阶函数除了可以接受函数作为参数，还可以把函数作为结果值返回。
一个函数返回值（return）为另一个函数
注：
后面的闭包课程，还会讲到高阶函数
"""


def test3(*args):
    def sum_nums():
        sum = 0
        for n in args:
            sum += n
        return sum

    return sum_nums   # 返回sun_nums函数
    # return sum_nums()  # 返回直接调用sun_nums后的结果


print(test3(2, 4, 6, 8))  # 返回 function
print(test3(2, 4, 6, 8)())  # 返回 20
